<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <title>本地存储indexDB</title>
    <script src="js/mui.min.js"></script>
    <link rel="stylesheet" type="text/css" href="css/reset.css"/>
    <link href="css/mui.min.css" rel="stylesheet"/>
    <link rel="stylesheet" type="text/css" href="fonts/iconfont.css"/>
    <style>
    	
  	</style>
</head>
<body>
	
    <script src="js/mtool.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/lovefield.js" type="text/javascript" charset="utf-8"></script>
    <script>
    	console.log(lf)

/**
 *创建一个模式构建器
 * 它提供了两个功能：createTable()和 connect()。 
 * createTable()在架构构建器中实例化一个表构建器，它将在构建器完成时有效地构造一个表。 
 * connect()最终确定模式构建并连接到数据存储上的数据库实例。
 * toDo 创建的是数据库不是表
 */
var schemaBuilder = lf.schema.create('todo', 1);

/**
Lovefield
类型						默认值			默认为Nullable								描述
lf.Type.ARRAY_BUFFER	null	是	JavaScript ArrayBuffer对象
lf.Type.BOOLEAN		false	没有	JavaScript boolean对象
lf.Type.DATE_TIME	Date(0)		没有		JavaScript Date，将在内部转换为timestamp integer
lf.Type.INTEGER		0		没有	32位整数
lf.Type.NUMBER		0		没有	JavaScript number类型
lf.Type.STRING		''		没有	JavaScript string类型
lf.Type.OBJECT	null	是			JavaScript Object，按原样存储
 */
//schemaBuilder.createTable('Item').
//  addColumn('id', lf.Type.INTEGER).
//  addColumn('description', lf.Type.STRING).
//  addColumn('deadline', lf.Type.DATE_TIME).
//  addColumn('done', lf.Type.BOOLEAN).
//  addPrimaryKey(['id']).
//  addIndex('idxDeadline', ['deadline'], false, lf.Order.DESC);
/**
 * 在Lovefield，存储单元是一排。
  行在整个数据库实例中具有唯一的行ID，
  因此Lovefield可以Number.MAX_SAFE_INTEGER在数据库实例中保存（）的行数存在理论上的限制。
在内部，该行表示为lf.Row。
此类专为Lovefield查询引擎而设计。
select查询返回的结果 是纯JavaScript对象，而不是lf.Row实例。
另一方面，用户应该使用createRow()函数来为insert()或准备数据insertOrReplace()，
因为这允许Lovefield有机会将用户有效负载安全地转换为Lovefield所需的格式。
简而言之，lf.Row摘要Lovefield如何序列化/反序列化底层数据存储中的行。
“ 选择和插入”中将提供更多详细信息 。
 */
var todoDb;
var item;
//打开数据库，执行数据库创建或必要时升级。
schemaBuilder.connect({onUpgrade: onUpgrade}).then(
   //所有新的/升级相关的东西都已完成
  /**  @param  {lf.Database}  db  */
  /** @param {lf.Database} db */
  function(db) {
    //新的db连接从这里开始
    console.log(db.schema_.tables)
  }).close();
//schemaBuilder.close();
/**
 *用户提供的升级功能，在Lovefield 
*创建新表
后调用。* 
注意：如果该函数发生其他异步操作而
不是在数据库上工作，则升级事务将
立即提交，并且很可能在升级过程中失败
归功于IndexedDB自动提交陷阱。
 @param  {lf.raw.BackStore}  rawDb 
*/
function onUpgrade(rawDb) {
  //显示当前持久化的版本。控制台。日志（ rawDb。 getVersion（））; 
  console.log(rawDb.getVersion());
// DROP TABLE进度。
  //此调用是同步的。
  rawDb.dropTable('Progress');
 //所有异步升级助手应该一个接一个地链接。
  //使用默认值“Smith”将列代理（类型字符串）添加到Purchase。
  return rawDb.addTableColumn('Purchase', 'agent', 'Smith').then(function() {
     //从照片中删除列元数据
    return rawDb.dropTableColumn('Photo', 'metadata');
  }).then(function() {
    // Rename Photo.isLocal to Photo.local.
    return rawDb.renameTableColumn('Photo', 'isLocal', 'local');
  }).then(function() {
 //因为IndexedDB自动提交而不支持转换：
    //当Lovefield尝试
    //从扫描现有对象存储区返回一个promise 
//  时，Firefox立即提交事务。用户//应该进行转储并在onUpgrade 
    //例程之外进行转换。
    //将整个数据库DUMP转换为JS对象。
    return rawDb.dump();
  });
};

/**
 * connect ： 每次只能召集一次
 */
//schemaBuilder.connect({onUpgrade:function(){
//	console.log('升级使用的')
//}}).then(function(db) {
//todoDb = db;
//item = db.getSchema().table('Item');
//var row = item.createRow({
//  'id': 2,
//  'description': 'Get a cup of coffee',
//  'deadline': new Date(),
//  'done': false
//});
//return db.insertOrReplace().into(item).values([row]).exec();
//}).then(function() {
//return todoDb.select().from(item).where(item.done.eq(false)).exec();
//}).then(function(results) {
//results.forEach(function(row) {
//  console.log(row['description'], 'before', row['deadline']);
//});
//});
    </script>
</body>
</html>